home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 271_02 / dump.c < prev    next >
Text File  |  1987-08-13  |  6KB  |  190 lines

  1. /*
  2. **                HEX FILE DUMP UTILITY
  3. **   Displays any file in hex and character representation
  4. **   in color or monochrome, depending upon type of video
  5. **   card installed.  Displays 20 lines per screen and waits
  6. **   for a keypress.
  7. **
  8. **   Rev 1.00   8-09-87 for Turbo-C  S.E. Margison
  9. **
  10. **   As distributed, this program requires (for compilation):
  11. **     "Steve's Turbo-C Library" version 1.30 or later
  12. **   which may be obtained without registration from many Bulletin
  13. **   Board Systems including:
  14. **      Compuserve IBMSW
  15. **      Cul-De-Sac (Holliston, MA.)
  16. **      GEnie
  17. **   and software library houses including:
  18. **      Public (Software) Library (Houston, TX.)
  19. **
  20. **   or by registration:
  21. **      $10 for Docs, Small Model Library
  22. **      $25 for Docs, C, S, M, L, H libraries, and complete library source
  23. **              in C and Assembler
  24. **     Steven E. Margison
  25. **     124 Sixth Street
  26. **     Downers Grove, IL, 60515
  27. **
  28. **
  29. ** Program requires at least one parameter, the name of the file to dump.
  30. ** A second parameter is taken to be an offset value to start dumping,
  31. ** default is the start of the file.  If a third value is present it is
  32. ** taken to be a hex byte value to highlite whenever encountered in the file.
  33. **
  34. ** More than a utility, this is a good demonstration of the direct
  35. ** video subroutines and video page switching mechanism (for CGA cards).
  36. ** Look upon this as a tutorial as well as a handy utility.
  37. */
  38.  
  39. #include <stdio.h>
  40. #include <ctype.h>
  41. #include <smdefs.h>
  42. #include <screen.h>
  43. #include <keys.h>
  44.  
  45. int adrclr,    /* address field color */
  46.     hexclr,    /* hex data color */
  47.     highclr,   /* highlite color */
  48.     prompt,    /* prompt line color */
  49.     ascclr;    /* ascii color */
  50.  
  51. char tbuf[82];
  52. int buffer[16];
  53. unsigned long offset = 0;
  54. FILE *f;
  55.  
  56. int mono, cpage, eoflag;
  57.  
  58. main(argc,argv)
  59. int argc;
  60. char *argv[];
  61. {
  62.    int i, lines, view, vflag;
  63.  
  64.    eoflag = vflag = NO;      /* default highlite off */
  65.  
  66.    if ((argc < 2) or (argc > 4))
  67.       error("Use: dump file [starting offset in hex] [highlite byte]");
  68.  
  69.    if((f = fopen(argv[1], "rb")) is NULL) cant(argv[1]);
  70.  
  71.    if(argc > 2) {
  72.       sscanf(argv[2], "%lx", &offset);
  73.       fseek(f, offset, 0);
  74.       }
  75.  
  76.    if (argc is 4) {  /* get the value to highlite */
  77.       sscanf(argv[3], "%02x", &view);
  78.       vflag = YES;
  79.       }
  80.  
  81.    i = stuff(0);   /* check video type */
  82.    if(i is MONO) {
  83.       mono = TRUE;
  84.       prompt = BLINKING;
  85.       adrclr = WHITE;
  86.       hexclr = HIWHITE;
  87.       ascclr = WHITE;
  88.       highclr = HIGHBLINK;
  89.       }
  90.    else {         /* for CGA cards */
  91.       vmode(CLR80);
  92.       mono = FALSE;
  93.       cpage = 1;       /* we'll write to page 1 first */
  94.       prompt = BROWN;
  95.       adrclr = LTGREEN;
  96.       hexclr = YELLOW;
  97.       ascclr = LTCYAN;
  98.       highclr = HIWHITE;
  99.       }
  100.  
  101.    dvid_init();    /* use direct video access routines */
  102.    dvid_cls();
  103.    dvid_move(0,0);
  104.    dvid_flush();
  105.    if(!mono) {
  106.       dvid_setpage(0, 1);       /* set page 0 as display page */
  107.       dvid_setpage(1, 0);       /* but set page 1 as writing page */
  108.       }
  109.    cursor_style(5, 0, 0);    /* kill the cursor */
  110.    lines = 20;
  111.    for ever {
  112.         /* if this were a level 1 file using read() and open()
  113.         ** the program would be faster.  Just a hint! */
  114.       for (i = 0; i < 16; i++) buffer[i] = fgetc(f);
  115.  
  116.       if(buffer[0] is -1) {
  117.          if(lines is 20) break;    /* we must've ended on even page */
  118.          eoflag = TRUE;
  119.          goto alldone;
  120.          }
  121.       dvid_attrib(adrclr);   /* set address color */
  122.       sprintf(tbuf, "%04lx: ",offset);  /* display address */
  123.       dvid_puts(tbuf);
  124.       dvid_attrib(hexclr);   /* set hex value color */
  125.       for (i = 0; i < 16; i++) {
  126.          if (buffer[i] isnot -1) {
  127.             if(vflag and (buffer[i] is view)) {  /* highlite this byte? */
  128.                dvid_attrib(highclr);
  129.                sprintf(tbuf, "%02x ", buffer[i]);
  130.                dvid_puts(tbuf);
  131.                dvid_attrib(hexclr);
  132.                }
  133.             else {
  134.                sprintf(tbuf, "%02x ", buffer[i]);
  135.                dvid_puts(tbuf);
  136.                }
  137.             }
  138.          else dvid_puts("   ");
  139.          }
  140.       dvid_attrib(ascclr);  /* display ascii data color */
  141.       dvid_puts("   ");
  142.       for (i = 0; i < 16; i++) {
  143.          if (buffer[i] isnot -1) {
  144.             if (!isprint(buffer[i])) buffer[i] = '.';
  145.             dvid_putchr(buffer[i]);
  146.             }
  147.          else dvid_putchr(' ');
  148.          }
  149.       dvid_putchr('\n');
  150.       if(lines-- is 0) {
  151.          alldone:
  152.          dvid_attrib(prompt);
  153.          dvid_say(22, 10, "Press any key to continue, ESCape to quit...");
  154.          if(!mono) dvid_setpage(cpage, 1);   /* display this page */
  155.          if(getkey() is ESC) {
  156.             dvid_setpage(0, 1);        /* return to page 0 */
  157.             if(!mono) cursor_style(1, 0, 0);  /* restore cursor */
  158.             else cursor_style(2, 0, 0);
  159.             aabort(1);
  160.             }
  161.          if(eoflag) break;
  162.          cpage++;     /* bump page #, maintain 0-3 */
  163.          cpage &= 3;
  164.  
  165.          if(!mono) dvid_setpage(cpage, 0);  /* set the next page for write */
  166.          dvid_cls();
  167.          dvid_flush();
  168.          lines = 20;
  169.          }
  170.       offset += 16;
  171.       }  /* end of forever loop */
  172.  
  173.    dvid_setpage(0, 1);   /* restore page 0 */
  174.    dvid_cls();
  175.    dvid_attrib(prompt);
  176.    dvid_say(22, 10, "End of File Encountered");
  177.    if(!mono) cursor_style(1, 0, 0);  /* restore cursor */
  178.    else cursor_style(2, 0, 0);
  179.    dvid_flush();
  180.    dvid_done();
  181. }
  182.  
  183.  
  184. dvid_puts(buf)
  185. char *buf;
  186. {
  187.    while(*buf isnot NULL) dvid_putchr(*buf++);
  188. }
  189.  
  190.